package com.triones.framework.common.util;

import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.ruoyi.common.utils.DateUtil;
import com.ruoyi.common.utils.DateUtils;

import java.io.File;
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.Random;

/**
 * @author cww
 * @version 1.0
 * 2024/7/17 14:51
 */

public class StringUtil {
    public static String getRandStr(int n) {
        Random random = new Random();
        String sRand = "";
        for (int i = 0; i < n; i++) {
            String rand = String.valueOf(random.nextInt(10));
            sRand += rand;
        }
        return sRand;
    }

    /**
     * 提供精确的加法运算。
     *
     * @param v1 被加数
     * @param v2 加数
     * @return 两个参数的和
     */
    public static Double add(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 提供精确的减法运算。
     *
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */
    public static double sub(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 提供精确的乘法运算。
     *
     * @param v1 被乘数
     * @param v2 乘数
     * @return 两个参数的积
     */
    public static Double mul(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 提供（相对）精确的除法运算，当发生除不尽的情况时， 精确到小数点以后10位，以后的数字四舍五入。
     *
     * @param v1 被除数
     * @param v2 除数
     * @return 两个参数的商
     */
    public static double div(double v1, double v2) {
        return div(v1, v2, 2);
    }

    /**
     * 提供（相对）精确的除法运算。 当发生除不尽的情况时，由scale参数指定精度，以后的数字四舍五入。
     *
     * @param v1    被除数
     * @param v2    除数
     * @param scale 表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    public static double div(double v1, double v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 提供精确的小数位四舍五入处理。
     *
     * @param v     需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static double round(double v, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                "The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(v));
        BigDecimal one = new BigDecimal("1");
        return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
    /**
     * 金额转分
     *
     * @param money
     * @return
     */
    public static String toFen(Double money) {
        BigDecimal fen = BigDecimal.valueOf(money).multiply(new BigDecimal(100));
        NumberFormat nFormat = NumberFormat.getNumberInstance();
        nFormat.setMaximumFractionDigits(0);
        nFormat.setGroupingUsed(false);
        return nFormat.format(fen);
    }

    public static String createSn(int subCode) {
        String code =  getRandomCode(6);
        String millis= DateUtils.simplicityDateTime();
        return subCode+""+millis+""+code;
    }
    /**
     * 随机n位数生成
     */
    public static String getRandomCode(int randomLen) {
        Random random = new Random();
        String str = "";
        int num = random.nextInt(new BigDecimal("10").pow(randomLen).intValue());
        //不足randomLen位前面补0
        str = String.format("%0" + randomLen + "d", num);
        return str;
    }
    public static Double toDouble(String str, Double defaultValue) {
        Double value = defaultValue;
        if (str == null || "".equals(str)) {
            return 0d;
        }
        try {
            value = Double.valueOf(str);
        } catch (Exception ex) {
            ex.printStackTrace();
            value = defaultValue;
        }
        return value;
    }

    public static String createQr(String content,String path) {
        QrConfig config = new QrConfig(300, 300);
       // config.setErrorCorrection("M"); // 设置纠错级别
        // 生成二维码并保存到文件
        File file = QrCodeUtil.generate(content, config, FileUtil.file(path));
        String filePath = file.getPath();
        return filePath;
    }

    public static File getCreateQrFile(String content,String path) {
        QrConfig config = new QrConfig(300, 300);
        // config.setErrorCorrection("M"); // 设置纠错级别
        // 生成二维码并保存到文件
        File file = QrCodeUtil.generate(content, config, FileUtil.file(path));
        return file;
    }

    public static String createPosterQr(String content,String path) {
        QrConfig config = new QrConfig(50, 50);
        // config.setErrorCorrection("M"); // 设置纠错级别
        // 生成二维码并保存到文件
        File file =  QrCodeUtil.generate(content, config, FileUtil.file(path));
        String filePath = file.getPath();
        return filePath;
    }

    public static void main(String[] args) {
        String content="https://sjd.hxtcsx.com/staffVerification?orderId=1&type=1";
        System.out.println(createQr(content,"d://file/staff/test.png"));
    }
}
